/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import bentity.beCliente;
import bentity.beProducto;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author renzo
 */
public class daoCliente {
    public int registrarCliente(beCliente cliente) throws Exception{
        int estadoCliente = this.getEstadoClienteEnBD(cliente.getEstadoCliente());
        Connection conn = daoHelper.dameConexion();
        String sql = "INSERT INTO CLIENTE (razon_social, ruc, telefono, email, fechainscripcion, nombrecontacto, estadocliente, direccion) VALUES (?, ?, ?, ?, NOW(), ?, ?, ?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, cliente.getRazonSocial());
        ps.setString(2, cliente.getRuc());
        ps.setString(3, cliente.getTelefono());
        ps.setString(4, cliente.getEmail());
        ps.setString(5, cliente.getNombreContacto());
        ps.setInt(6, estadoCliente);
        ps.setString(7, cliente.getDireccion());
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int getEstadoClienteEnBD(int estadoCliente) throws Exception{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int estado = -1;
        String sql = "SELECT ID_DATO FROM DATOS_COMBO WHERE NOMBRE_COMBO = 'ECLIEN' ";
        if (estadoCliente == beCliente.C_ACTIVO)
            sql += "AND NOMBRE_DATO = 'Activo'";
        if (estadoCliente == beCliente.C_ELIMINADO)
            sql += "AND NOMBRE_DATO = 'Inactivo'";

        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        rs = ps.executeQuery();
        rs.next();
        estado = rs.getInt(1);
        rs.close();
        ps.close();
        conn.close();
        return estado;
    }

    public ArrayList<beCliente> queryClientesByFilters(String strRazonSocial, String strRUC, String strTelefono, String strInscripcionDesde, String strInscripcionHasta, String strContacto) throws Exception {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int []contador = new int[7];
        String sql = "SELECT * FROM CLIENTE WHERE ESTADOCLIENTE = ? ";
        contador[0] = 1;
        if (!strRazonSocial.isEmpty()){
            sql += " AND RAZON_SOCIAL LIKE '%'||?||'%' ";
            contador[1] = 1;
        }
        if (!strRUC.isEmpty()){
            sql += " AND RUC = ? ";
            contador[2] = 1;
        }
        if (!strTelefono.isEmpty()){
            sql += " AND TELEFONO = ? ";
            contador[3] = 1;
        }
        if (!strInscripcionDesde.isEmpty()){
            sql += " AND FECHAINSCRIPCION >= CAST( ? AS DATE ) ";
            contador[4] = 1;
        }
        if (!strInscripcionHasta.isEmpty()){
            sql += " AND FECHAINSCRIPCION <= CAST( ? AS DATE) ";
            contador[5] = 1;
        }
        if (!strContacto.isEmpty()){
            sql += " AND NOMBRECONTACTO LIKE '%'||?||'%' ";
            contador[6] = 1;
        }
        sql += " ORDER BY RAZON_SOCIAL ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int j=0;
        for(int i=0; i<7; i++){
            if (contador[i]==1){
                j++;
                switch (i){
                    case 0:
                        ps.setInt(j,this.getEstadoClienteEnBD(beCliente.C_ACTIVO));
                        break;
                    case 1:
                        ps.setString(j,strRazonSocial);
                        break;
                    case 2:
                        ps.setString(j,strRUC);
                        break;
                    case 3:
                        ps.setString(j,strTelefono);
                        break;
                    case 4:
                        ps.setString(j,strInscripcionDesde);
                        break;
                    case 5:
                        ps.setString(j,strInscripcionHasta);
                        break;
                    case 6:
                        ps.setString(j,strContacto);
                        break;
                }
            }
        }
        rs = ps.executeQuery();
        ArrayList<beCliente> clientes = new ArrayList<beCliente>();
        beCliente c = null;
        while (rs.next()){
            c = new beCliente(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(7),rs.getString(5),rs.getDate(6),beCliente.C_ACTIVO,rs.getString(9));
            clientes.add(c);
        }
        rs.close();
        ps.close();
        conn.close();
        return clientes;
    }

    public int modificarCliente(beCliente cliente) throws Exception{
        Connection conn = daoHelper.dameConexion();
        String sql = "UPDATE CLIENTE SET RAZON_SOCIAL = ? , RUC = ? , TELEFONO = ? , EMAIL = ? , NOMBRECONTACTO = ? , DIRECCION = ? WHERE ID_CLIENTE = ? ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, cliente.getRazonSocial());
        ps.setString(2, cliente.getRuc());
        ps.setString(3, cliente.getTelefono());
        ps.setString(4, cliente.getEmail());
        ps.setString(5, cliente.getNombreContacto());
        ps.setString(6, cliente.getDireccion());
        ps.setInt(7, cliente.getIdCliente());
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int eliminarCliente(beCliente cliente) throws Exception{
        if (this.validarDependencias(cliente)){
            Connection conn = daoHelper.dameConexion();
            int estadoInactivoBD = this.getEstadoClienteEnBD(beCliente.C_ELIMINADO);
            String sql = "UPDATE CLIENTE SET ESTADOCLIENTE = "+estadoInactivoBD+" WHERE ID_CLIENTE = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, cliente.getIdCliente());
            ps.executeUpdate();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;
        }
        else
            return daoHelper.TRANSACCION_FALLIDA;
    }

    public boolean validarDependencias(beCliente cliente) throws Exception{
        Connection conn = daoHelper.dameConexion();
        String sql = "SELECT COUNT(*) AS CONTEO FROM PEDIDO WHERE ID_CLIENTE = ? ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1,cliente.getIdCliente());
        ResultSet rs = ps.executeQuery();
        rs.next();
        int conteo = rs.getInt(1);
        rs.close();
        ps.close();
        conn.close();
        return (conteo == 0);
    }
}
